/*
Бот QDroid. он-же форма, контейнер для вебстраницы и прочее.
Его мы отдаем в исполняемую среду скрипта по ссылке.

2011.03.16 НЕ ПОНЯТНО КАК БЫТЬ, В СЛУЧАЕ, ЕСЛИ МЫ РАБОТАЕМ БЕЗ GUI ?!

*/

#ifndef t_webViewForm_H
#define t_webViewForm_H

#include <QtCore>
#include <QtScript>

#include <QtGui>
#include <QObject>
#include <QDialog>
#include <QMap>
/* -*/
    #include <QPrintDialog>
    #include <QPrinter>
    #include <QPageSetupDialog>
//-*/
#include <QWebView>
#include <QWebElement>
#include <t_advWebPage.h>

//#include <t_returnSyncObject.h>
/*

*/


class t_webViewForm : public QObject
{
    Q_OBJECT
public:
    //explicit
            t_webViewForm(QObject *parent = 0);

signals:
    void urlClick(QWebFrame*, QUrl, QWebPage::NavigationType);
        //Вместо URL может быть любая строка, в том числе и стро
    void evaluate(QWebFrame* frame, QString command);//запрос на выполнение команды из страницы
    void reloadSection(QWebFrame* frame, QString sectionName);//запрос обновить часть страницы

public slots:
    //QString generateForm(t_infoObject_v *object, QString formatName = "");
    int fillTemplate(QString version);
    void printPreviewNeeds(QPrinter *_printer);
    void printPreview();//запустить окно предварительной печати
    void printNow();
    void printAndExportWiki();
    int show(QString htmltext);
    QDialog *setHtml(QString htmltext); //not static потому что используетя этот объект для генерации данных для принтера
    QDialog *setHtml(QStringList htmlTextList);

    void setButtonsVisible(bool _buttonsAreVisible);
    void repaint() {if (cWebView!=0) {cWebView->repaint();}  }


    bool isElementPresent(QString elementName);
    int setElementValue(QString elementName, QString elementValue);
    QString getElementValue(QString elementName);
    int setElementInnerHTML(QString elementName, QString elementValue);
    QString getElementInnerHTML(QString elementName);

    int setElementAttribute(QString elementName, QString attributeName, QString elementValue); //attributeName - регистрозависим! это свойства JavaScript!
    QString getElementAttribute(QString elementName, QString attributeName); //если атрибута нет - отдается null значение (QString::isNull()==true)

    void setWindowTitle(QString winTitle);

    static QPrinter *getPrinter() { if (posbPrinter==0) posbPrinter = new QPrinter(QPrinter::HighResolution); return posbPrinter;}

    //слоты для поддержки функций веб-сервиса удаленного доступа к html-интерфейсу.
    //пока это просто функции. Потом по идее надо перестроить в соответствии с "t_returnSyncObject"
    // и идеологией "внутренних веб-сервисов".
    // Включить t_returnSyncObject в ядро?

    /*
        QString ws_getScriptHtmlPage( ); //отдадим текст страницы полностью
    */
    /* int ns__sendClientUpdateEvent( )
      "разрешается" в изменение элементов страницы через
          setElementValue()
          setElementInnerHTML
    */
    /* ns__getServerUpdateEvent
      TODO: Надо как-то отслеживать. Именно изменения свойств и значений объектов...
      тут надо добавить "очередь изменений"
        пополнять её когда делается
            setElementValue()
            setElementInnerHTML()
        надо как-то отличать изменения внешние (как-бы от клиента)
        и изменение от скрипта. Сейчас у нас всего 2 таких функции.
        Возможно надо добавить "дефолтный" аргумент, - мол не включать
        это изменение в очередь изменений?
        т.е. выставление значения - это сделано человеком на удаленном GUI


    */

    /*
        ns__getBinaryObject
    */

    void setContentEditable(bool enabled){ if (cWebView!=0) return cWebView->page()->setContentEditable(enabled);};//2011.05.03_0008 added
   // void setWindowStyleSheet(QString StyleSheet);


protected:
    t_advWebPage *cWPage;
    QGridLayout *boxLayut;
    QDialog *shContainer;

    ///QList<ns__updateEvent> eventStack;//очередь описания событий.
    //класс ns__updateEvent - доступен здесь потому что
    // это структура вебсервиса
    // TODO: подвлючить в это расширение структуры веб-сервиса


private:
    //QPrintPreviewDialog *prDialog;

    QPrintPreviewDialog *prDialog;
    QMap<QString,QString> tMap;
    QWebView *cWebView;

    QToolBar *toolBar;

    bool buttonsAreVisible;
   // QPushButton *doPrivewAndPrint;
   // QPushButton *doPrint;
   // QPushButton *doWiki;
   // QPushButton *doExit;

    static QPrinter *posbPrinter; //надо бы потом перенаправить на сервисы от hiveQueen
};


/*============================================================================
  ============================================================================*/
// QDroidDiveStep:: start <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

//ДАЛЕЕ - ФУНКЦИИ ДЛЯ РАБОТЫ С ОБЪЕТОМ ИЗ СКРИПТА
// ++2010,05,21
// адаптация проста - заменить t_webViewForm на имя класса..
//
//----------------------------------------------------------------------
//нужно чтобы можно было передавать эти элементы как параметры в функции внутри QtScript
// спец. настройки для QtScript (v 2008.11.25)
// Шаг 3 из 8
Q_DECLARE_METATYPE(t_webViewForm*);

Q_DECLARE_METATYPE(QWebFrame*); //прочее...
Q_DECLARE_METATYPE(t_advWebPage*);

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 4 из 8
static QScriptValue f_qdroid_t_webViewForm_toScriptValue(QScriptEngine *engine, t_webViewForm* const &in)
{ return engine->newQObject(in); }

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 5 из 8
static void f_qdroid_t_webViewForm_fromScriptValue(const QScriptValue &object, t_webViewForm* &out)
{ out = qobject_cast<t_webViewForm*>(object.toQObject()); }

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 6 из 8
//конструктор для последующего его определения как new в скрипте
// ВНИМАНИЕ! если конструктор не совсем стандартный - например требует входного параметра - используй закомментированный пример
static QScriptValue f_qdroid_t_webViewForm_constructor(QScriptContext *QSContext, QScriptEngine *QSEngine)
        {
                //t_BaseBot BaseBot;
                QScriptValue QtSObject;
                //QtSObject=QSEngine->newQObject(new t_webViewForm(QSContext->argument(0).toString())); // <<-- тут первый аргумент приводится к строке
                QtSObject=QSEngine->newQObject(new t_webViewForm() ); //
                return QtSObject;
        }

// шаги 7 и 8 должны быть выполнены в программе которая собирается использовать данный класс совместно со скриптовым движком
//// спец. настройки для QtScript (v 2008.11.25)
//// Шаг 7 из 8
//// - это qScriptRegisterMetaType регистрация но это нужно сделать в головном классе
//// например в глобальной функции "define__qdroid_qtscript_functions()"
////// t_FileList TYPE defenition
//	qScriptRegisterMetaType(_QSEngine, f_qdroid_t_webViewForm_toScriptValue, f_qdroid_t_webViewForm_fromScriptValue);

//// спец. настройки для QtScript (v 2008.11.25)
//// Шаг 8 из 8
////- определение конструктора в контексте скрипта
////// t_FileList NEW constructor defenition
//	QScriptValue fun5_constr = _QSEngine->newFunction(f_qdroid_t_webViewForm_constructor);
//	_QSEngine->globalObject().setProperty("t_webViewForm", fun5_constr);

//именно эту функцию надо вызвать для регистрации класса в скриптовом движке
static int f_qdroid_t_webViewForm_register(QScriptEngine *_QSEngine)
        {
                //шаг 7 регистрация метатипа
                qScriptRegisterMetaType(_QSEngine, f_qdroid_t_webViewForm_toScriptValue, f_qdroid_t_webViewForm_fromScriptValue);
                //шаг 8 регистрация конструктора
                _QSEngine->globalObject().setProperty("WebView", _QSEngine->newFunction(f_qdroid_t_webViewForm_constructor));

                //qDebug() << "qdlib_WebView:: loading resource file default_res.qdlib_webview.rcc: " << QResource::registerResource("default_res.qdlib_webview.rcc");//prepeared with "rcc -binary myresource.qrc -o myresource.rcc"
                //QResource *res=new QResource("C:/_wrk/QDroid/qDroid_Bot_Hive/bin/win/default_res.qdlib_webview.rcc");
                //qDebug() << "res->isValid()" << res->isValid();
                return 0;
        }
//QDroidDiveStep:: finish >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#endif // t_webViewForm_H
